<?php
/**
* @software         [JiJinCMS]
* @author           [上海集锦信息科技有限公司]
* @website          [http://www.jijinweb.com]
* @email            [sunny@jijinweb.com]
**/
namespace app\admin\controller;
use think\facade\View;
use think\facade\Db;
use think\facade\Request;
class InfoImport extends \app\admin\controller\Info{
    public function __construct(\think\App $app) {
        parent::__construct($app);
        $this->TmpPath="./d/upload/".date("Ymd")."/";
        $this->pubid= make_pubid();//这个pubid是初始的，每行数据的pubid为初始pubid+excel所在行的数字，如当前生成的pubid为123456,当导入表格的第2行的图片，则pubid为123456+2
    }
    //数据导入
    public function index(){
        if(request()->isPost()){
            $this->params=Request::param();
            //数据验证
            $validate = \think\facade\Validate::rule('cat_type','require')
            ->rule([
                'cat_type'  => 'require',
                'file' => 'require',
                'state'=>'require',
            ])->message([
                "cat_type.require"=>"请选择目标栏目方式",
                "file.require"=>"请上传数据包",
                "state.require"=>"请选择导入的数据是否需要审核"
            ]);
            if (!$validate->check(Request::param())) {
                $this->error($validate->getError());
            }
            //如果选择了选中的栏目，要验证是否有target_catid字段
            if(Request::param("cat_type")=="selfCheck"&&!Request::param("target_catid",0,"intval")){
                $this->error("请选择目标栏目");
            }
            //创建数据表对象
            $this->creatExcelObj();
            //获取表格数据
            $this->getExcelData();
            //提取表格第一行做为字段名称
            $this->getFieldName();
            //提取图片文件，并保存到服务器
            $this->saveImg();                   
            //修正$this->fieldKey,$this->fieldName
            //$Export->repairFieldName();    
            $result=$this->StartInsertData();
            $this->success($result);
        }else{
            //查询模型下的字段
            $formtype_arr=explode("\r\n",$this->ModelInfo['formtemp']);            
            $modelField=array();
            foreach($formtype_arr as $v){
                $f=explode("<!--field-->",$v);
                //如果这个字段不是录入字段，跳过
                if(!in_array($f[1],explode(",",$this->ModelInfo['is_enter']))){
                    continue;
                }                
                $modelAllField[]=["field"=>$f[1],"name"=>$f[0]];
                //如果这个字段不在主表，直接踢出
                $issystem=$this->TableFieldModel->where(array("table_id"=>$this->ModelInfo['table_id'],"field"=>$f[1],"issystem"=>1))->find();
                if(!$issystem){
                    continue;
                }
                $field1['field']=$f[1];
                $field1['name']=$f[0];
                $modelIndexField[]=$field1;
            }        
            View::assign("modelAllField",$modelAllField);//模型所有字段，包括主表和副表的（用于导入数据的时候选择要哪些字段）
            View::assign("catInc",$this->model->selfModelCat());//用于检测重复字段的，只查主表
            View::assign("modelIndexField",$modelIndexField);
            return View::fetch();
        }
    }
   //创建表格对像
    public function creatExcelObj(){
        $objReader = \PHPExcel_IOFactory::createReader('Excel5');
        if(strstr($this->params["file"],'.xlsx')){
            $objReader = \PHPExcel_IOFactory::createReader('Excel2007');
        }

//        $objPHPExcel = $objReader->load(".".$this->params["file"]);
//        $this->currentSheet = $objPHPExcel->getActiveSheet();
        $objPHPExcel = $objReader->load(".". str_replace(config('setting.weburl'),'',$this->params["file"]));
        $this->currentSheet = $objPHPExcel->getSheet(0);
    }
    //把表格里的图片保存到服务器，并把具体的路径
    public function saveImg(){
        //先处理图片
        $AllImages= $this->currentSheet->getDrawingCollection();
        $ArrayTmp="";
        foreach($AllImages as $drawing){
            if($drawing instanceof \PHPExcel_Worksheet_MemoryDrawing){
                $image = $drawing->getImageResource();
                $filename=$drawing->getIndexedFilename();
                $XY=$drawing->getCoordinates();
                //提取xy的数字部分
                preg_match("/(\d+)/", $XY,$matches);
                $XY_NUM=$matches[1];
                //把图片临时放到缓存里
                $cache_path="./upload/cache/import_img_cache/".$filename;
                switch($drawing ->getMimeType()){
                    case 'image/jpg':
                    case 'image/jpeg':
                        $imageFileName .= '.jpg' ;
                        imagejpeg( $drawing ->getImageResource(), $cache_path );
                    break ;
                    case 'image/gif' :
                        $imageFileName .= '.gif' ;
                        imagegif( $drawing ->getImageResource(), $cache_path );
                        break ;
                    case 'image/png' :
                        $imageFileName .= '.png' ;
                        imagepng( $drawing ->getImageResource(), $cache_path );
                        break ;
                }
                //                
                $config=[];
                $config['pubid']=$this->pubid+$XY_NUM;
                $config['listtype']="img";        
                $config['chunks']=1;//chunks如果大于1为大文件分片上传
                $config['chunk']=0;//如果开启了分处，则当前是第几个分片   
                //
                $_FILES['file']["name"]=$filename;
                $_FILES['file']["type"]="application/octet-stream";
                $_FILES['file']["tmp_name"]=$cache_path;
                $_FILES['file']["error"]=0;
                $_FILES['file']["size"]=  filesize($cache_path);
                //强行对request里注入合并后的缓存文件
                request()->withFiles($_FILES);
                $file = request()->file();  
                $FileModel=new \app\admin\model\FileModel();
                $data=$FileModel->saveFile($config,$file['file']);
                //删除缓存的文件
                unlink ($cache_path);
                //把图片的单元格的值设置为图片名称
                $cell = $this->currentSheet->getCell($XY);
                $cell->setValue($data['filepath']);
            }
        }
        //重新获取一下表格数据
        $this->getExcelData();
        //删除第一行字段名
        $data=$this->excelData;
        unset($data[0]);
        $this->excelData=$data;
    }
    //获取表格内的数据内容
    public function getExcelData(){
        $data=$this->currentSheet->toArray();
        $this->excelData=$data;
    }
    //分割并提取表格第一行做为字段名称
    public function getFieldName(){
        $fieldName=array();
        $fieldName["id"]="ID";
        $fieldName["catid"]="栏目名称";   
        $data=$this->excelData;
        foreach($data[0] as $key=>$v){
            $field_arr=explode("==",$v);
            $fieldKey[$key]=$field_arr[1];
            $fieldName[$field_arr[1]]=$field_arr[0];
        }
        $fieldName["result_status"]="导入结果";
        unset($data[0]);
        $this->fieldKey=$fieldKey;//返回一个excel下标对应字段名的数组，例：array(0=>title,1=>keywords)
        $this->fieldName=$fieldName;//返回一个根据字段下标，对应字段中文值的数组，例：array('title'=>'标题','keywords'=>'关键字')
        $this->excelData=$data;//返回一个去掉第一行的excel data
    }
    //开始插入数据
    public function StartInsertData(){
        $back_data=array();
        $back_data[]=$this->fieldName;  
        foreach($this->excelData as $key=>$v){
            $key2=$key+1;//这里的key2用在pubid上面为了和saveImg方法的pubid一至，这里要加1。国为saveImg的pubid增加的变量是按表格所在行，而当前key是数据行
            $_POST=array();
            $_POST["id"]=0;
            if($this->params["cat_type"]=="selfCheck"){
                $_POST["catid"]=$this->params["catid"];
            }
            $_POST["pubid"]=$this->pubid+$key2;
            foreach($v as $key2=>$v2){  
                //如果是栏目字段
                if($this->fieldKey[$key2]=="catid"){
                    //判断栏目的形式，栏目名称|栏目ID                
                    if($this->params["cat_type"]=="catName"){//栏目名称
                        $_POST["catid"]=Db::name("cat")->where(array("name"=>$v2))->getField("catid");
                    }else if($this->params["cat_type"]=="catId"){//栏目ID
                        $_POST["catid"]=intval($v2);
                    }
                    //  
                }else{
                    $_POST[$this->fieldKey[$key2]]=$v2?$v2:"";
                }
            }
            //查看catid是否存在
            if(!$_POST["catid"]){
                unset($_POST["pubid"]);
                $_POST["result_status"]="<span style='color:red'>导入失败-缺少catid</span>";    
                $resultData=$_POST;
            }else{            
                //如果遇到重复标题如何处理
                //直接新增(为了减少服务器资源这里就不做重复查询)
                if($this->params["check_title"]=="add"){
                    $resultData=$this->saveAction("import_add","导入成功（新增）");
                }else{
                    //查看数据是否存在
                    $id=Db::name("cms_".$this->ModelInfo["table_name"])->where(array($this->params['check_fieldName']=>$_POST[$this->params['check_fieldName']],"catid"=>$_POST["catid"]))->value("id");
                    //存在相同数据并且声明了更新数据
                    if($id){
                        unset($_POST["pubid"]);//存在数据了就销毁pubid
                        if($this->params["check_title"]=="update"){
                            if(Request::param("state")=="checked"){////如果是直接导入到主表里的，直接做更新
                                $_POST["id"]=$id;
                                $resultData=$this->saveAction("import_update","导入成功（更新）");
                            }else{////如果不是导入到请表，向cache表里做新增，但是要加上id字段
                                $_POST["id"]=$id;
                                $resultData=$this->saveAction("import_add","导入成功（更新）");
                            }
                        }else{
                            unset($_POST["pubid"]);
                            $_POST["result_status"]="<span style='color:red'>遇重复的[".$this->params['check_fieldName']."]字段，跳过</span>";    
                            $resultData=$_POST;
                        }
                    }else{
                        $resultData=$this->saveAction("import_add","导入成功（新增）");
                    }
                }
            }
            $back_data[]=$resultData;
        }   
        return $back_data;
    }
    //保存操作
    private function saveAction($type,$result_status){
        //创建指定格式的数据
        $CreateData=$this->dataCreate($_POST,$type);
        $resultdata=array_merge($CreateData['index'],$CreateData['data']);
        //保存到缓存表
        $cache_id=$this->model->saveCache($CreateData,Request::param("state"));
        //直接审核
        if(Request::param("state")=="checked"){
            $resultdata["id"]=$this->model->setCheckCache($cache_id);
        }   
        foreach($this->fieldName as $key=>$v3){
            $newdata[$key]=$resultdata[$key]?$resultdata[$key]:"-";
        }
        $newdata["catid"]=$GLOBALS['cat'][$newdata["catid"]]['name'];
        $newdata["result_status"]=$result_status;
        return $newdata;
    } 
}